5-2 nestjs如何拿捏单库vs多库(多租户):复杂业务场景数据库选择
ORM 库是 NestJS 与数据库之间的桥梁。在选择 ORM 之前,首先要明确业务场景——是单库还是多库,是关系型还是非关系型。不同的选择直接影响架构复杂度。
单数据库
优点:
- 架构简单,部署和维护成本低
- 数据一致性容易保证,不存在数据同步问题
- 事务处理相对简单,不涉及分布式事务
缺点:
- 可扩展性受限,难以应对高并发和大数据量场景
- 单点故障风险高,一旦数据库出现问题,整个系统都会受到影响
- 读写性能受限于单个数据库的处理能力
- 可能受到物理机硬件限制,扩展性受限
适用场景:
- 数据量不大(如日增 10 万以内)、并发要求不高的场景
- 成本敏感的小型应用:小程序、公众号、官网
- 需要快速开发和部署的应用
多数据库
优点:
- 可扩展性强,可以通过增加数据库节点来提高系统的并发处理能力和存储容量
- 可以根据业务需求进行数据分片,提高查询性能
- 可以通过数据冗余和备份来提高系统的可用性和容错性
缺点:
- 架构复杂,部署和维护成本较高
- 数据一致性问题需要特别注意,需要进行数据同步和一致性保证
- 分布式事务处理较为复杂,需要使用特定的技术方案
- 代码管理复杂度增加——多种 ORM、多种 Schema 需要并行维护
- 数据库迁移更加复杂——不同数据库的 SQL 语法可能不同
适用场景:
- 用户自定义数据库需求(有的要求 MySQL,有的要求 MongoDB,有的要求 Oracle)
- 低代码项目——用户侧提供的数据库配置各不相同
- 对数据安全有物理隔离要求的合规/法规场景
- 高性能场景——多库读写、读写分离
- 跨系统升级——需要从老旧系统读取数据
读写分离架构
高性能的读写分离通常采用以下几种实现方式:
- 中间件代理:使用 MySQL Proxy、MaxScale、ProxySQL 等中间件,根据 SQL 语句类型自动路由到主库或从库
- 应用程序控制:在应用程序中手动将写操作发送到主库,读操作发送到从库。灵活性高,但实现复杂度也较高
- 框架级别支持:一些框架(如 Spring、Hibernate)通过配置不同数据源自动路由读写操作
- 数据库级别支持:MySQL、PostgreSQL 等内置主从复制和读写分离功能
通常来说,写是数据库的瓶颈,读不是。主数据库负责写入和同步,从数据库负责读取,这是最常见的多库架构。
数据库集群与运维扩展
多库模式通常与 Kubernetes 等容器化技术结合使用,实现高可用性和集群化管理:
- 容器化部署:将数据库实例打包为 Docker 镜像,通过 K8s Deployment/StatefulSet 管理
- 服务发现:使用 K8s Service 提供稳定的网络访问入口
- 配置管理:使用 ConfigMap 和 Secret 管理数据库连接信息
- 数据持久化:使用 PV/PVC 管理数据持久化和跨节点共享
- 高可用性:通过副本控制器和健康检查实现自动恢复和故障转移
- 弹性伸缩:通过 HPA 根据负载自动增减数据库实例数量
合理的数据库架构设计原则
- 根据业务需求和数据特点进行合理的数据分片
- 采用主从复制或多主复制实现数据冗余和备份
- 使用缓存技术(如 Redis)缓存热点数据,减轻读取压力
- 写操作采用主库写入、异步同步到从库的方式
- 读操作采用读写分离,将读请求分发到多个从库
- 根据业务需求选择合适的数据库产品(关系型或非关系型)
多租户的两种隔离方式
逻辑隔离(单库):
- 不同租户通过字段区分,共享同一数据库
- 适用于安全性要求不高、数据量适中、成本敏感的场景
- 例:日记系统中多个租户通过 tenant_id 字段区分
物理隔离(多库):
- 每个租户使用独立的数据库
- 适用于用户安全性要求极高、需要物理隔离的场景
- 例:用户素材数据存储在自己独立的数据库中
ORM 选型与业务场景的关系
根据业务场景选择 ORM:
| 场景 | 推荐方案 |
|---|---|
| 单库 + MySQL | TypeORM 或 Prisma |
| 单库 + 需要方便操作 | Prisma(Prisma Client 封装好) |
| 多版本 MySQL 兼容 | TypeORM(生态最完善,文档全面) |
| MongoDB 对接 | Mongoose(支持最新特性,TypeORM/Prisma 对 MongoDB 支持有限) |
| 多类型数据库 | 需要多个 ORM 配合 |
绝大多数业务场景都是单库单 ORM。只有低代码项目、跨系统升级等特殊场景才需要多 ORM 对接多数据库。
技术选型的核心原则
学习的目的是为业务服务。在具体项目中:
- 从业务需求出发选择技术方案
- 绝大多数场景只需单库,不要过度设计
- 哪个环节出现性能瓶颈,就扩展哪个环节
- 架构设计是在基础架构上"套娃"——网关不够扩网关、ORM 不够扩 ORM、数据库不够扩数据库
↑